from ahocorasick import Automaton

def build_ac_automaton(keywords):
    """构建AC自动机"""
    automaton = Automaton()
    for idx, word in enumerate(keywords):
        automaton.add_word(word, (idx, word))
    automaton.make_automaton()
    return automaton

def contains_all_keywords(text, keyword_str):
    """
    判断文本是否包含所有关键字
    :param text: 待检测文本
    :param keyword_str: 空格分隔的关键字字符串
    :return: Boolean
    """
    # 分割关键字并去重
    keywords = list(set(keyword_str.strip().split()))
    if not keywords:
        return False
    
    # 构建自动机
    automaton = build_ac_automaton(keywords)
    
    # 匹配结果集合
    found = set()
    
    # 执行匹配
    for end_index, (original_idx, keyword) in automaton.iter(text):
        found.add(keyword)
        # 提前终止判断
        if len(found) == len(keywords):
            return True
    
    return len(found) == len(keywords)

# 测试用例
if __name__ == "__main__":
    test_cases = [
        ("科技金融上海国际研讨会在沪举行", "上海 科技", True),   # 包含所有关键字
        ("上海举办展览", "上海 科技", False),      # 缺少部分关键字
        ("科技创新", "上海 科技", False),         # 缺少部分关键字
        ("上海科技公司", "上海 科技", True),       # 重叠词匹配
        ("上海上海科技", "上海 科技", True),       # 重复词匹配
        ("", "上海 科技", False),                # 空文本
        ("测试文本", "", False)                  # 空关键字
    ]

    for text, keywords, expected in test_cases:
        result = contains_all_keywords(text, keywords)
        print(f"文本: '{text}' | 关键字: '{keywords}' | 结果: {result} | 预期: {expected} | {'通过' if result == expected else '失败'}")